package com.mvp.mvpdemo.net

import androidx.lifecycle.LiveData
import com.mvp.mvpdemo.Const
import com.mvp.mvpdemo.bean.BAnnerBean
import com.mvp.mvpdemo.bean.LoginBean
import com.mvp.mvpdemo.bean.UpLoadFile
import com.mvp.mvpdemo.bean.WXBean
import com.retrofit.call_adapter.livedata_call_adapter.ApiResponse
import okhttp3.MultipartBody
import okhttp3.RequestBody
import okhttp3.ResponseBody
import retrofit2.Call
import retrofit2.http.*
import java.util.*

interface APIService {
    @FormUrlEncoded
    @POST("user/login")
    fun login2(
        @Field("username") username: String,
        @Field("password") password: String
    ): Call<LoginBean>

    /**
     * url 以参数形式使用 == @POST(url)
     */
    @FormUrlEncoded
    @POST
    fun login3(
        @Url url: String?,
        @Field("username") username: String,
        @Field("password") password: String
    ): Call<LoginBean>

    /**
     * url @完整路径
     */
    @FormUrlEncoded
    @POST(Const.BASE_URL + "user/login")
    fun login4(
        @Field("username") username: String,
        @Field("password") password: String
    ): Call<LoginBean>

    @GET("user/logout/json")
    fun logout(): Call<LoginBean>

    /**
     * livedata
     */
    @GET("banner/json")
    fun bannerList(): LiveData<ApiResponse<BAnnerBean>>

    @GET("wxarticle/chapters/json")
    fun wxList(): LiveData<ApiResponse<WXBean>>

    /**
     * 协程
     * suspend  挂起函数
     */
    @FormUrlEncoded
    @POST("user/login")
    suspend fun loginCC( @Field("username") username: String,
               @Field("password") password: String): LoginBean





    /************************************************************************************/

    @POST("/api/v1/xxxxx")
    fun postJson(@Body requestBody: RequestBody): Call<ResponseBody>
    /**
     * 多参数  多文件
     */
    @Multipart
    @POST("https://a1000.top/up")
    fun upload(@PartMap paramMap: TreeMap<String, RequestBody>, @Part fileList: List<MultipartBody.Part>
    ): Call<UpLoadFile>

    @Multipart
    @POST("https://a1000.top/up")
    fun upload4(@Part("user") user: RequestBody,@Part("token")token:RequestBody, @Part file: MultipartBody.Part
    ): Call<UpLoadFile>

    @Multipart
    @POST("https://a1000.top/up")
    fun uploads(
        @PartMap paramMap: TreeMap<String, RequestBody>,
        @Part fileList: List<MultipartBody.Part>
    ): Call<ResponseBody>

    /**
     * 单文件
     * 这种方式函数必须指定@MultiPart注解，函数参数类型为MultipartBody.Part类型，不需要@Part注解指定字段名称。
     */
    @POST("https://a1000.top/up")
    @Multipart
    fun upload1(@Part file: MultipartBody.Part): Call<UpLoadFile>

    /**
     * 单文件
     * 以part注解 定义 文件的字段  不建议这样使用
     *
     *
     * 这种方式同样要求函数必须指定@Multipart注解，函数参数使用@Part("file")注解，
     * 通过@Part注解指定字段名称，但是函数参数类型不可以是MultipartBody.Part类型。
     * 通过PHP服务器接收的时候需要通过$_POST['file']来接收，而不是$_FILES['file']来接收，
     * 这是因为Retrofit在解析@Part注解时指定的头没有filename属性。
     */
    @POST("https://a1000.top/up")
    @Multipart
    fun upload2(@Part("file") file: RequestBody): Call<ResponseBody>

    @POST("https://a1000.top/up")
    @Multipart
    fun upload22(@Part("file") file: RequestBody):LiveData<ApiResponse<UpLoadFile>>

    /**
     * 这种方式函数不可以使用@Multipart注解和@FormUrlEncoded注解，
     * 并且@Body注解只能使用一次，函数的参数类型没有要求，
     * 只要可以通过Convert转换成RequestBody就行，不过上传文件一般用直接用RequestBody。
     * 如果使用MultipartBody类型作为参数，一定要设置type为MultipartBody.FORM。
     */
    @POST("https://a1000.top/up")
    fun upload3(@Body file: RequestBody): Call<UpLoadFile>

    @POST("https://a1000.top/up")
    fun upload33(@Body file: RequestBody): LiveData<ApiResponse<UpLoadFile>>

    @Multipart
    @POST("https://a1000.top/up")
    fun upload(@PartMap paramMap: TreeMap<String, RequestBody>, @Part("file") file: RequestBody): Call<UpLoadFile>

    @Multipart
    @POST("https://a1000.top/up")
    fun upload2(@PartMap paramMap: TreeMap<String, RequestBody>): Call<UpLoadFile>


}